package com.filldream.fastboot.common.entity;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.filldream.fastboot.common.util.Assert;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import java.util.Arrays;

/**
 * 分页排序构造器
 * 暂不支持多字段排序，有需要的可以自行改造
 */
@Data
public class BasePage {

    @ApiModelProperty(value = "页数,默认1", example = "1")
    private Integer pageNo = 1;

    @ApiModelProperty(value = "条数,默认20", example = "20")
    private Integer pageSize = 20;

    @ApiModelProperty(value = "后端专用，前端对接时忽略", example = "0", hidden = true)
    private Integer pageStart;

    @ApiModelProperty(value = "排序字段")
    private String fieldKey;

    @ApiModelProperty(value = "排序方式 false-降序 true-升序")
    private Boolean fieldOrder;

    @ApiModelProperty(value = "Sql格式的排序方式 asc-升序 desc-升序", example = "asc", hidden = true)
    private String sqlOrder;

    /**
     * 有参构造器
     * 默认自动计算pageStart
     *
     * @param pageNo
     * @param pageSize
     */
    public BasePage(Integer pageNo, Integer pageSize) {
        this.pageNo = pageNo;
        this.pageSize = pageSize;
        this.pageStart = (pageNo != 0 ? (pageNo - 1) : 0) * pageSize;
    }

    /**
     * 无参构造器
     * 默认自动计算pageStart
     */
    public BasePage() {
        this.pageStart = (pageNo != 0 ? (pageNo - 1) : 0) * pageSize;
    }

    /**
     * 自动计算pageStart
     * 用于sql语句中的limit参数
     */
    public void initPageStart() {
        this.pageStart = (pageNo != 0 ? (pageNo - 1) : 0) * pageSize;
    }

    /**
     * 不分页
     */
    public void noPage() {
        this.pageNo = 1;
        this.pageSize = -1;
        this.pageStart = -1;
    }

    /**
     * 默认分页，不排序
     *
     * @return
     */
    public Page page() {
        Assert.isEmpty(ErrorCode.PARAM_ERR_F.diyMsg("分页PageNo或PageSize不能为空"), pageNo, pageSize);
        return new Page(pageNo, pageSize);
    }

    /**
     * 分页排序
     * 当接口没有传入需要排序的字段和排序的规则，则使用defaultFiledKey和defaultIsAsc排序
     *
     * @param defaultFiledKey 默认排序字段
     * @param defaultIsAsc    默认排序规则，默认true即升序asc
     * @return
     */
    public Page pageOrder(String defaultFiledKey, boolean defaultIsAsc) {
        Page page = page();
        // 没有传入排序规则，则默认defaultIsAsc为排序规则
        if (this.getFieldOrder() == null) {
            this.setFieldOrder(defaultIsAsc);
        }
        // 没有传入排序字段，则默认defaultFiledKey为排序字段
        if (StringUtils.isBlank(this.getFieldKey())) {
            this.setFieldKey(defaultFiledKey);
        }
        //转换为OrderItem
        if (StringUtils.isNotBlank(this.getFieldKey())) {
            OrderItem orderItem = new OrderItem();
            orderItem.setColumn(StrUtil.toUnderlineCase(this.getFieldKey()));
            orderItem.setAsc(this.getFieldOrder());
            page.setOrders(Arrays.asList(orderItem));
            //设置Sql格式字段
            this.setSqlOrder(this.getFieldOrder() ? "asc" : "desc");
        }
        //设置pageStart
        initPageStart();
        return page;
    }

    /**
     * 分页且排序
     * 前端不传则默认create_time为排序字段
     *
     * @param defaultIsAsc 指定排序规则
     * @return
     */
    public Page pageOrder(boolean defaultIsAsc) {
        return pageOrder("create_time", defaultIsAsc);
    }

    /**
     * 分页且排序
     * 默认按create_time降序
     *
     * @return
     */
    public Page pageOrder() {
        return pageOrder("create_time", false);
    }

}
